/*
 * Clase controladora del la vista salón
 */
package grest.controller;



import grest.model.*;
import grest.view.FormAdmin;
import java.awt.event.ActionListener;
import grest.view.*;
import java.awt.event.ActionEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Observable;
import javax.swing.JTable;
import javax.swing.*;

/**
 *
 * @author santiago,rodrigo,agustin
 */
public class CntrlrAbbm extends Observable implements ActionListener {
    
    private VistaABBM form = null;
    private TableModelABM model = null;
    private Entidad tupla = null;
    private String tipo = null;
    
    public CntrlrAbbm(VistaABBM form, String tipo, Entidad e){
        this.form = form;
        this.tupla = e;
        model = new TableModelABM(e);
        ((JTable) form.getControls("tblTabla")).setModel(model);        
        
        if (tipo.equalsIgnoreCase(FormAdmin.RESERVAS))
        { 
            ((JLabel)form.getControls("lblTitulo")).setText(FormAdmin.RESERVAS);
        }
        else if (tipo.equalsIgnoreCase(FormAdmin.MOZOS))
        {
            ((JLabel)form.getControls("lblTitulo")).setText(FormAdmin.MOZOS);
        }
        else if (tipo.equalsIgnoreCase(FormAdmin.CLIENTES))
        {
            ((JLabel)form.getControls("lblTitulo")).setText(FormAdmin.CLIENTES);
        }
        else if (tipo.equalsIgnoreCase(FormAdmin.MESAS))
        {
            ((JLabel)form.getControls("lblTitulo")).setText(FormAdmin.MESAS);
        }
        else if (tipo.equalsIgnoreCase(FormAdmin.PRODUCTOS))
        {
            ((JLabel)form.getControls("lblTitulo")).setText(FormAdmin.PRODUCTOS);
        }        
        this.tipo=tipo;
    }
    
    
    //agregue esto para que cuando cliquee modificacion se realize efectivamente la modificacion
    @Override
    public void actionPerformed(ActionEvent e){
        if(e.getSource()==form.getControls("btnMod")){
            doUpdate();   
        }
        else if(e.getSource()==form.getControls("btnBaja"))
        {
            doDelete();
        }
        else if(e.getSource()==form.getControls("btnAlta"))
        {
            try{
                doInsert();
            }catch(SQLException ex){
                JOptionPane.showMessageDialog(this.form, "No fue posible realizar la operación. Detalle" + ex.getMessage(),"Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

     private void doUpdate() {
        // recorro la lista de objetos de la JTable y envio a grabar a b.d.
        for(Entidad entity : model.getModel() )
           {
               if ( entity.isPreChanged() ){ 
                  System.out.println("ejecuto: ["+entity.getInsertQuery()+"]");
                  DataIO.executeQuery(entity.getInsertQuery());
                  entity.setPreChanged(false);  
               }
               if ( entity.isChanged() ) {
                  DataIO.executeQuery(entity.getUpdateQuery());
                  System.out.println("ejecuto: ["+entity.getUpdateQuery()+"]");
                  entity.setChanged(false);
               } 
           }
        DataIO.doCommit(); 
        model.fireTableDataChanged();
        notifyObservers();
    }
     
     private void doInsert() throws SQLException 
     {
         Entidad c;
         //aca deberia ser cualquier entidad
         //CLIENTE O ENTIDAD A MOSTRAR y de acuerdo a la entidad la instancio..
         if (tipo.equalsIgnoreCase(FormAdmin.CLIENTES))
            c = new Clientes();
         else if (tipo.equalsIgnoreCase(FormAdmin.MOZOS))
            c = new Mozos();
         else if (tipo.equalsIgnoreCase(FormAdmin.RESERVAS))
            c = new Reservas();
         else if (tipo.equalsIgnoreCase(FormAdmin.PRODUCTOS))
            c = new Productos();
         else if (tipo.equalsIgnoreCase(FormAdmin.MESAS))
            c = new Mesas();
         else
            c = null;
         ResultSet id =DataIO.getResultSet(c.onPreInsertQuery());
         id.next();
         c.setID(id.getInt("GEN_ID"));
         //se modifico para insercion si da grabar se guarda
         c.setPreChanged(true);
         c.setChanged(false);
         setChanged();
         //no se modifico para modificacion sino para insercion
         model.getModel().add(c);
         model.fireTableDataChanged();
         //SE AGREGA A LA TABLA     
    }
     
    private void doDelete() {
        int row = ((JTable)this.form.getControls("tblTabla")).getSelectionModel().getMinSelectionIndex();
        if ( row != -1 ) {
            Entidad t = model.getModel().get(row); 
            if ( DataIO.executeQuery(t.getDeleteQuery()) ) {
                System.out.println("ejecuto: ["+t.getDeleteQuery()+"]");
                DataIO.doCommit();
                model.getModel().remove(t);
                model.fireTableRowsDeleted(row,row);
            }
        }
        setChanged();
        notifyObservers();
    }
}
